package vip.sone.eureka.consumer.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * 使用@HystrixCommand来指定降级方法
 * 当服务消费方触发了服务请求超时异常，服务消费者就通过HystrixCommand注解中指定的降级逻辑进行执行
 * 这样的机制，对自身服务起到了基础的保护，同时还为异常情况提供了自动的"服务降级"切换机制。
 * 发现的问题:
 * 	"服务降级"触发后,即使有正常的可服务的服务请求也不会请求到 (通过后面的断路器知识猜测应该是开启了断路器)
 *
 * @author winstone jianwenzhen@qq.com
 * @date 19-4-12 下午4:42
 */
@Slf4j
@RestController
public class ConsumerController {

	@Autowired
	ConsumerService consumerService;

	@GetMapping("/consume")
	public String consume() {
		return consumerService.consume();
	}

	@Service
	class ConsumerService {

		@Autowired
		RestTemplate restTemplate;

		/**
		 * HystrixCommand(fallbackMethod): 指定降级方法
		 */
		@HystrixCommand(fallbackMethod = "fallback")
		public String consume() {
			return restTemplate.getForObject("http://eureka-client/product", String.class);
		}

		public String fallback() {
			return "fallback";
		}
	}
}
